import xlrd
# xlrd 要用1.20 不要用2.0+版本，不然不支持xlsx
import xlwt
import time

#功能：对比2个文件，指定列，比较两个文件每一行的差异，差异会生成到一个新文件


list1 = 'D:\\win-desktop\\1.xlsx'
list2 = 'D:\\win-desktop\\2.xlsx'


origin_dict = {}  # 初始化，用于保存源文件{key(主键):value(需要核对的列值)}
target_dict = {}  # 初始化，用于保存目标文件{key(主键):value(需要核对的列值)}


def compare_excel(ori_path, tar_path, col_ori, col_tar, keys_ori, keys_tar):
    '''
    ori_path:用于存放源文件
    tar_path:用于存放目标文件
    col_ori:源文件中需要比较的列
    col_tar:目标文件中需要比较的列
    keys_ori：源文件中需要比较的列的key
    keys_tar：目标文件中需要比较的列key

例子：源文件如下：{'p0-app01': '10.130.5.176',}
   目标文件如下：{'p0-web03': '10.130.10.26'}

   else：

   col_ori = keys_ori ,col_tar = keys_tar
   源文件如下：{'10.130.10.152': '10.130.10.152'}
   目标文件如下：{'10.8.26.164': '10.8.26.164'}
   同样可以比较(却决于你的两张数据)
    '''
    success = 0  # 核对无差异的个数
    fail = 0  # 核对结果有差异的个数
    row_res = 0  # 要写入的文件的行

    # 分别打开源文件与目标文件
    wb_ori = xlrd.open_workbook(ori_path)
    wb_tar = xlrd.open_workbook(tar_path)



    # 新建一个excel，用于存放核对结果
    wb_res = xlwt.Workbook()

    # 分别获取源文件与目标文件的sheet
    sheet_ori = wb_ori.sheet_by_index(0)
    sheet_tar = wb_tar.sheet_by_index(0)
    # 新建一名称为 result 的sheet页，用于存放核对具体结果
    sheet_res = wb_res.add_sheet('result')

    # 获取源文件中由主键、需核对列组成的键值对，放入字典中
    for row_ori in range(0, sheet_ori.nrows):
        cell_ori_key = sheet_ori.cell_value(row_ori, keys_ori)  # 因我的源文件的主键位于第0列，故该列未参数化，大家可以视自己实际情况进行优化
        # cell_ori_key1 = sheet_ori.cell_value(row_ori, 5)
        cell_ori_value = sheet_ori.cell_value(row_ori, col_ori)
        origin_dict[cell_ori_key] = cell_ori_value
        # origin_dict[cell_ori_key + cell_ori_key1] = cell_ori_value
    print('源文件如下：%s' % origin_dict)

    # 获取目标文件中由主键、待核对列组成的键值对，放入字典中
    for row_tar in range(0, sheet_tar.nrows):
        cell_tar_key = sheet_tar.cell_value(row_tar, keys_tar)
        cell_tar_value = sheet_tar.cell_value(row_tar, col_tar)
        target_dict[cell_tar_key] = cell_tar_value
    print('目标文件如下：%s' % target_dict)

    try:
        for i in origin_dict.keys():  # 获取源文件字典的键
            if target_dict.get(i) == origin_dict.get(i):  # 对比两个字典中相同键的值
                success += 1  # 值相等，则无差异数+1
                sheet_res.write(row_res + 1, 0, i)  # 将键写入结果文件的第0列
                sheet_res.write(row_res + 1, 1, '你俩长一样')  # 将核对无差异结果写入结果文件的第1列
                row_res += 1  # 结果文件行数+1
                print('IP %s 核对无差异' % i)
            else:
                fail += 1  # 值不相等，则有差异数+1
                sheet_res.write(row_res + 1, 0, i)
                sheet_res.write(row_res + 1, 1, '核对有差异：源文件的值为：%s，目标文件的值为:%s' % (
                origin_dict.get(i), target_dict.get(i)))  # #将核对有差异结果写入结果文件的第1列
                row_res += 1  # 结果文件行数+1
                print('%s 核对有差异：源文件的值为：%s，目标文件的值为:%s' % (i, origin_dict.get(i), target_dict.get(i)))
                wb_res.save('D:\\win-desktop\\result.xls')  # 保存结果文件
        print(time.strftime('%Y-%m-%d %H-%M-%S', time.localtime()) + '核对完成，共核对 %d 条，其中无差异 %d 条， 有差异 %d条' % (
        len(origin_dict), success, fail))
    except Exception as error:
        print(str(error))
        


if __name__ == '__main__':
    # 核对源文件第5列，目标文件第7列
    compare_excel(list1, list2, 1, 1, 0, 0)